Como siempre me han enseñado en lógica, el operador "y" significa que ambos valores deben ser verdaderos, para que la declaración completa sea verdadera. Si tiene muchas declaraciones encadenadas con "y", entonces si cualquiera de ellas es falsa, debería hacer que toda la afirmación sea falsa. En Ruby, sin embargo, me encontré con este escenario:
horizon_flat = true one_up_and_down = true magellan_fell = false flat_earth_thesis = horizon_flat and one_up_and_down and magellan_fell puts("Hey ruby, doesn't the horizon look flat?") puts(horizon_flat) # true puts("Isn't there only one up and one down?") puts(one_up_and_down) # true puts("Did Magellan fall off the earth?") puts(magellan_fell) # false puts("Is the earth flat?") puts(flat_earth_thesis) # true Extrañamente, si solo ejecuto la declaración en sí, devuelve false puts(horizon_flat and one_up_and_down and magellan_fell) # false
Pero si almaceno esa declaración en una variable y luego la llamo, la variable da como resultado verdadero. ¿Por qué Ruby piensa que la tierra es plana?
Mientras esperas esto:
flat_earth_thesis = horizon_flat and one_up_and_down and magellan_fellPara ser evaluado como:
flat_earth_thesis = (horizon_flat and one_up_and_down and magellan_fell)En cambio, se evalúa como:
(flat_earth_thesis = horizon_flat) and one_up_and_down and magellan_fellComo se indica en los comentarios, revise la precedencia del operador .